const { UserAuth } = require('../models');
const User = require('../models/User');
const { generateId } = require('../utils/idGenerator');

class UserAuthService {
  /**
   * 根据openid查找用户认证信息
   * @param {string} openid - 第三方平台openid
   * @param {string} authType - 认证类型
   * @returns {Promise<Object>} 用户认证信息
   */
  async findByOpenid(openid, authType = 'wechat') {
    return await UserAuth.findOne({
      where: { openid, auth_type: authType }
    });
  }

  /**
   * 创建或更新用户认证信息
   * @param {Object} authData - 认证数据
   * @returns {Promise<Object>} 创建或更新的认证信息
   */
  async createOrUpdate(authData) {
    const { openid, auth_type = 'wechat' } = authData;
    
    // 查找是否已存在认证信息
    const existingAuth = await this.findByOpenid(openid, auth_type);
    
    if (existingAuth) {
      // 如果认证信息已存在，检查对应的用户是否存在
      const user = await User.findByPk(existingAuth.user_id);
      if (user) {
        // 用户存在，更新认证信息并返回
        return await existingAuth.update(authData);
      } else {
        // 用户不存在，创建新用户
        const newUser = await this.createNewUser(openid, auth_type);
        // 更新认证信息中的user_id
        return await existingAuth.update({ ...authData, user_id: newUser.id });
      }
    } else {
      // 认证信息不存在，创建新用户和认证信息
      const newUser = await this.createNewUser(openid, auth_type);
      return await UserAuth.create({
        id: generateId(),
        user_id: newUser.id,
        auth_type,
        openid,
        ...authData
      });
    }
  }

  /**
   * 创建新用户
   * @param {string} openid - 第三方平台openid
   * @param {string} authType - 认证类型
   * @returns {Promise<Object>} 新创建的用户
   */
  async createNewUser(openid, authType = 'wechat') {
    const userId = generateId();
    const username = `${authType}_user_${openid.substring(0, 8)}`;
    
    return await User.create({
      id: userId,
      username: username,
      password: generateId(), // 生成随机密码
      phone: null,
      avatar: null,
      status: 1
    });
  }

  /**
   * 根据授权码查找用户认证信息，包含用户信息
   * @param {string} code - 授权码
   * @returns {Promise<Object>} 包含用户信息的认证信息
   */
  async findByCode(code) {
    return await UserAuth.findOne({
      where: { code }
    });
  }

  /**
   * 更新授权码状态
   * @param {string} code - 授权码
   * @param {Object} updateData - 更新数据
   * @returns {Promise<Object>} 更新后的认证信息
   */
  async updateCodeStatus(code, updateData) {
    const authInfo = await this.findByCode(code);
    if (authInfo) {
      return await authInfo.update(updateData);
    }
    return null;
  }
}

module.exports = new UserAuthService();